package TDAMap;

public interface Map<K,V> {
	
	/**
	 * Retorna el número de entradas del mapeo
	 * @return la cantidad de entradas del mapeo
	 */
	public int size();
	
	/**
	 * Consulta si el mapeo está vacío
	 * @return true si el mapeo está vacío, false en otro caso
	 */
	public boolean isEmpty();
	
	/**
	 * Si el mapeo contiene una entrada e con clave
	 * igual a k, entonces retorna el valor de e, si no retorna null.
	 * @param k la clave de la entrada a buscar.
	 * @return el valor de una entrada con clave k, null si no existe dicha entrada.
	 */
	public V get (K k) throws InvalidKeyException;
	
	/**
	 * Si el mapeo no tiene una entrada con clave k,
	 * añade la entrada (k,v) y retorna null. Sino,
	 * reemplaza con v el valor de la entrada con clave k
	 * y retorna el valor anterior.
	 * @param k la clave de la entrada a añadir.
	 * @param v el valor de la entrada a añadir
	 * @return null si la entrada no exístia, sino retorna el valor anterior de la entrada.
	 */
	public V put (K k, V v) throws InvalidKeyException;
	
	/**
	 * Elimina del mapeo la entrada con clave igual a k y 
	 * retorna su valor, si no existe dicha entrada retorna null.
	 * @param k la clave de la entrada a buscar.
	 * @return el valor de la entrada eliminada, si no existe dicha entrada retorna null.
	 */
	public V remove (K k) throws InvalidKeyException;
	
	/**
	 * Retorna un iterable con todas las claves.
	 * @return un iterable de las claves en el mapeo.
	 */
	public Iterable<K> keys();
	
	/**
	 * Retorna un iterable con todos los valores.
	 * @return un iterable de los valores en el mapeo.
	 */
	public Iterable<V> values();
	
	/**
	 * Retorna un iterable con todas las entradas.
	 * @return un iterable de las entradas en el mapeo.
	 */
	public Iterable<Entry<K,V>> entries();

}
